/* 
 * File:   MotorColisiones.cpp
 * Author: 75.02 - Grupo 7, 2do cuatrimestre 2012.
 * 
 * Created on 31 de octubre de 2012, 19:21
 */

#include "MotorColisiones.h"
using namespace TP::Juego::Motorizacion;

MotorColisiones::MotorColisiones() {
}

MotorColisiones::~MotorColisiones() {
}

Ticks MotorColisiones::notificacionAvanceTiempo(Ticks pTiempo) {

	/* Para toda arena de juego (escenario) => 
	 * Para todo Actor en el escenario =>
	 * Computa las colisiones del actor con las diferentes entidades de la arena
	 * de juego.
	 */
    // Para toda partida corrienndo.
    for (vector<Partida*>::iterator itPartidas = this->getPartidas().begin();
         itPartidas < this->getPartidas().end();
         ++itPartidas) 
    {
        
        // Colisiones Actor x Actor.
        this->computarColisionesActorActor (*itPartidas);
        
        // Colisiones Actor x Utilidad.
        this->computarColisionesActorUtilidad (*itPartidas);
        
    }
}

Partida* MotorColisiones::correrPartida(Partida* pPartida) {
	if (pPartida)
		this->_partidas.push_back(pPartida);
    return pPartida;
}

vector<Partida*>& MotorColisiones::getPartidas() {
	return this->_partidas;
}

void MotorColisiones::computarColisionesActorActor (Partida* pPartida){
    
    vector<Actor*>& colisionantes = pPartida->ArenaJuego()->getActores();
    vector<Actor*>& colisionados = pPartida->ArenaJuego()->getActores();
    
    for (vector<Actor*>::iterator colisionantesIt = colisionantes.begin(); colisionantesIt != colisionantes.end(); ++colisionantesIt)
        for (vector<Actor*>::iterator colisionadosIt = colisionados.begin(); colisionadosIt != colisionados.end(); ++colisionadosIt)
            ((IColisionante*) *colisionantesIt)->colisionar ((IColisionado*) *colisionadosIt);
}

void MotorColisiones::computarColisionesActorUtilidad (Partida* pPartida){
    vector<Actor*>& colisionantes = pPartida->ArenaJuego()->getActores();
    vector<Utilidad*>& colisionados = pPartida->ArenaJuego()->getUtilidades();
    
    for (vector<Actor*>::iterator colisionantesIt = colisionantes.begin(); colisionantesIt != colisionantes.end(); ++colisionantesIt)
        for (vector<Utilidad*>::iterator colisionadosIt = colisionados.begin(); colisionadosIt != colisionados.end(); ++colisionadosIt)
            ((IColisionante*) *colisionantesIt)->colisionar ((IColisionado*) *colisionadosIt);

}
